
%module ModuleModule

SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)

%import "LibDL/global_typemaps.i"
%import "./LibDL/Tensor/Tensor.i"
%import "./LibDL/options/options.i"
%import "./LibDL/ordered_dict/ordered_dict.i"
%shared_ptr(torch::nn::Module);
%shared_ptr(torch::nn::Conv1dImpl);
%shared_ptr(torch::nn::Conv2dImpl);
%shared_ptr(torch::nn::Conv3dImpl);
%shared_ptr(torch::nn::LinearImpl);
%shared_ptr(torch::nn::BilinearImpl);
%shared_ptr(torch::nn::DropoutImpl);
%shared_ptr(torch::nn::EmbeddingImpl);
%shared_ptr(torch::nn::AvgPool1dImpl);
%shared_ptr(torch::nn::AvgPool2dImpl);
%shared_ptr(torch::nn::AvgPool3dImpl);
%shared_ptr(torch::nn::MaxPool1dImpl);
%shared_ptr(torch::nn::MaxPool2dImpl);
%shared_ptr(torch::nn::MaxPool3dImpl);
%shared_ptr(torch::nn::MaxUnpool1dImpl);
%shared_ptr(torch::nn::MaxUnpool2dImpl);
%shared_ptr(torch::nn::MaxUnpool3dImpl);
%shared_ptr(torch::nn::AdaptiveAvgPool1dImpl);
%shared_ptr(torch::nn::AdaptiveAvgPool2dImpl);
%shared_ptr(torch::nn::AdaptiveAvgPool3dImpl);
%shared_ptr(torch::nn::FractionalMaxPool2dImpl);
%shared_ptr(torch::nn::FractionalMaxPool3dImpl);
%shared_ptr(torch::nn::LPPool1dImpl);
%shared_ptr(torch::nn::LPPool2dImpl);
%shared_ptr(torch::nn::BatchNorm1dImpl);
%shared_ptr(torch::nn::BatchNorm2dImpl);
%shared_ptr(torch::nn::BatchNorm3dImpl);
%shared_ptr(torch::nn::RNN);
%shared_ptr(torch::nn::LSTM);
%shared_ptr(torch::nn::GRU);
%shared_ptr(torch::nn::ReLU);
%shared_ptr(torch::nn::Hardtanh);
%shared_ptr(torch::nn::LeakyReLU);
%shared_ptr(torch::nn::PReLU);
%shared_ptr(torch::nn::ReLU6);
%shared_ptr(torch::nn::SELU);
%shared_ptr(torch::nn::CELU);
%shared_ptr(torch::nn::GELU);
%shared_ptr(torch::nn::Sigmoid);
%shared_ptr(torch::nn::Softplus);
%shared_ptr(torch::nn::Softshrink);
%shared_ptr(torch::nn::Softsign);
%shared_ptr(torch::nn::Tanh);
%shared_ptr(torch::nn::Tanhshrink);
%shared_ptr(torch::nn::Threshold);
%shared_ptr(torch::nn::Softmin);
%shared_ptr(torch::nn::Softmax);
%shared_ptr(torch::nn::Softmax2d);
%shared_ptr(torch::nn::LogSoftmax);
%shared_ptr(torch::nn::ASMoutput);
%shared_ptr(torch::nn::AdaptiveLogSoftmaxWithLossOptions);
%shared_ptr(torch::nn::Hardshrink);
%shared_ptr(torch::nn::ELU);
%shared_ptr(torch::nn::RReLU);
%shared_ptr(torch::nn::LogSigmoid);
%shared_ptr(torch::nn::CosineSimilarityImpl);
%shared_ptr(torch::nn::PairwiseDistanceImpl);
%shared_ptr(torch::nn::L1Loss);
%shared_ptr(torch::nn::MSELoss);
%shared_ptr(torch::nn::CrossEntropyLoss);
%shared_ptr(torch::nn::CTCLoss);
%shared_ptr(torch::nn::NLLLoss);
%shared_ptr(torch::nn::PoissonNLLLoss);
%shared_ptr(torch::nn::KLDivLoss);
%shared_ptr(torch::nn::BCELoss);
%shared_ptr(torch::nn::BCEWithLogitsLoss);
%shared_ptr(torch::nn::MarginRankingLoss);
%shared_ptr(torch::nn::HingeEmbeddingLoss);
%shared_ptr(torch::nn::MultiLabelMarginLoss);
%shared_ptr(torch::nn::SmoothL1Loss);
%shared_ptr(torch::nn::SoftMarginLoss);
%shared_ptr(torch::nn::MultiLabelSoftMarginLoss);
%shared_ptr(torch::nn::CosineEmbeddingLoss);
%shared_ptr(torch::nn::MultiMarginLoss);
%shared_ptr(torch::nn::TripletMarginLoss);
%shared_ptr(torch::nn::PixelShuffle);
%shared_ptr(torch::nn::Upsample);
%shared_ptr(torch::nn::UpsamplingNearest2d);
%shared_ptr(torch::nn::UpsamplingBilinear2d);

%shared_ptr(nn::Module);
%shared_ptr(nn::Conv1d);
%shared_ptr(nn::Conv2d);
%shared_ptr(nn::Conv3d);
%shared_ptr(nn::Linear);
%shared_ptr(nn::Bilinear);
%shared_ptr(nn::Dropout);
%shared_ptr(nn::Embedding);
%shared_ptr(nn::AvgPool1d);
%shared_ptr(nn::AvgPool2d);
%shared_ptr(nn::AvgPool3d);
%shared_ptr(nn::AdaptiveAvgPool1d);
%shared_ptr(nn::AdaptiveAvgPool2d);
%shared_ptr(nn::AdaptiveAvgPool3d);
%shared_ptr(nn::MaxPool1d);
%shared_ptr(nn::MaxPool2d);
%shared_ptr(nn::MaxPool3d);
%shared_ptr(nn::MaxUnpool1d);
%shared_ptr(nn::MaxUnpool2d);
%shared_ptr(nn::MaxUnpool3d);
%shared_ptr(nn::AdaptiveMaxPool1d);
%shared_ptr(nn::AdaptiveMaxPool2d);
%shared_ptr(nn::AdaptiveMaxPool3d);
%shared_ptr(nn::FractionalMaxPool2d);
%shared_ptr(nn::FractionalMaxPool3d);
%shared_ptr(nn::LPPool1d);
%shared_ptr(nn::LPPool2d);
%shared_ptr(nn::BatchNorm1d);
%shared_ptr(nn::BatchNorm2d);
%shared_ptr(nn::BatchNorm3d);
%shared_ptr(nn::RNN);
%shared_ptr(nn::LSTM);
%shared_ptr(nn::GRU);
%shared_ptr(nn::ReLU);
%shared_ptr(nn::Hardtanh);
%shared_ptr(nn::LeakyReLU);
%shared_ptr(nn::PReLU);
%shared_ptr(nn::ReLU6);
%shared_ptr(nn::SELU);
%shared_ptr(nn::CELU);
%shared_ptr(nn::GELU);
%shared_ptr(nn::Sigmoid);
%shared_ptr(nn::Softplus);
%shared_ptr(nn::Softshrink);
%shared_ptr(nn::Softsign);
%shared_ptr(nn::Tanh);
%shared_ptr(nn::Tanhshrink);
%shared_ptr(nn::Threshold);
%shared_ptr(nn::Softmin);
%shared_ptr(nn::Softmax);
%shared_ptr(nn::Softmax2d);
%shared_ptr(nn::LogSoftmax);
%shared_ptr(nn::ASMoutput);
%shared_ptr(nn::AdaptiveLogSoftmaxWithLoss);
%shared_ptr(nn::MultiheadAttention);
%shared_ptr(nn::Hardshrink);
%shared_ptr(nn::ELU);
%shared_ptr(nn::RReLU);
%shared_ptr(nn::LogSigmoid);
%shared_ptr(nn::CosineSimilarity);
%shared_ptr(nn::PairwiseDistance);
%shared_ptr(nn::L1Loss);
%shared_ptr(nn::MSELoss);
%shared_ptr(nn::CrossEntropyLoss);
%shared_ptr(nn::CTCLoss);
%shared_ptr(nn::NLLLoss);
%shared_ptr(nn::PoissonNLLLoss);
%shared_ptr(nn::KLDivLoss);
%shared_ptr(nn::BCELoss);
%shared_ptr(nn::BCEWithLogitsLoss);
%shared_ptr(nn::MarginRankingLoss);
%shared_ptr(nn::HingeEmbeddingLoss);
%shared_ptr(nn::MultiLabelMarginLoss);
%shared_ptr(nn::SmoothL1Loss);
%shared_ptr(nn::SoftMarginLoss);
%shared_ptr(nn::MultiLabelSoftMarginLoss);
%shared_ptr(nn::CosineEmbeddingLoss);
%shared_ptr(nn::MultiMarginLoss);
%shared_ptr(nn::TripletMarginLoss);
%shared_ptr(nn::PixelShuffle);
%shared_ptr(nn::Upsample);
%shared_ptr(nn::UpsamplingBilinear2d);
%shared_ptr(nn::UpsamplingNearest2d);


%typemap(javaimports)  SWIGTYPE
%{
import LibDL.core.*;
%}

%{
#include "./LibDL/nn/Modules/Modules.h"
#include "./LibDL/nn/Modules/ModuleTypes.h"

%}

%nspace nn::Module;
%nspace nn::Conv1d;
%nspace nn::Conv2d;
%nspace nn::Conv3d;
%nspace nn::Linear;
%nspace nn::Bilinear;
%nspace nn::Dropout;
%nspace nn::Embedding;
%nspace nn::AvgPool1d;
%nspace nn::AvgPool2d;
%nspace nn::AvgPool3d;
%nspace nn::AdaptiveAvgPool1d;
%nspace nn::AdaptiveAvgPool2d;
%nspace nn::AdaptiveAvgPool3d;
%nspace nn::MaxPool1d;
%nspace nn::MaxPool2d;
%nspace nn::MaxPool3d;
%nspace nn::MaxUnpool1d;
%nspace nn::MaxUnpool2d;
%nspace nn::MaxUnpool3d;
%nspace nn::AdaptiveMaxPool1d;
%nspace nn::AdaptiveMaxPool2d;
%nspace nn::AdaptiveMaxPool3d;
%nspace nn::FractionalMaxPool2d;
%nspace nn::FractionalMaxPool3d;
%nspace nn::LPPool1d;
%nspace nn::LPPool2d;
%nspace nn::BatchNorm1d;
%nspace nn::BatchNorm2d;
%nspace nn::BatchNorm3d;
%nspace nn::RNN;
%nspace nn::LSTM;
%nspace nn::GRU;
%nspace nn::ReLU;
%nspace nn::Hardtanh;
%nspace nn::LeakyReLU;
%nspace nn::PReLU;
%nspace nn::ReLU6;
%nspace nn::SELU;
%nspace nn::CELU;
%nspace nn::GELU;
%nspace nn::Sigmoid;
%nspace nn::Softplus;
%nspace nn::Softshrink;
%nspace nn::Softsign;
%nspace nn::Tanh;
%nspace nn::Tanhshrink;
%nspace nn::Threshold;
%nspace nn::Softmin;
%nspace nn::Softmax;
%nspace nn::Softmax2d;
%nspace nn::LogSoftmax;
%nspace nn::ASMoutput;
%nspace nn::AdaptiveLogSoftmaxWithLoss;
%nspace nn::MultiheadAttention;
%nspace nn::Hardshrink;
%nspace nn::ELU;
%nspace nn::RReLU;
%nspace nn::LogSigmoid;
%nspace nn::CosineSimilarity;
%nspace nn::PairwiseDistance;
%nspace nn::L1Loss;
%nspace nn::MSELoss;
%nspace nn::CrossEntropyLoss;
%nspace nn::CTCLoss;
%nspace nn::NLLLoss;
%nspace nn::PoissonNLLLoss;
%nspace nn::KLDivLoss;
%nspace nn::BCELoss;
%nspace nn::BCEWithLogitsLoss;
%nspace nn::MarginRankingLoss;
%nspace nn::HingeEmbeddingLoss;
%nspace nn::MultiLabelMarginLoss;
%nspace nn::SmoothL1Loss;
%nspace nn::SoftMarginLoss;
%nspace nn::MultiLabelSoftMarginLoss;
%nspace nn::CosineEmbeddingLoss;
%nspace nn::MultiMarginLoss;
%nspace nn::TripletMarginLoss;
%nspace nn::PixelShuffle;
%nspace nn::Upsample;
%nspace nn::UpsamplingNearest2d;
%nspace nn::UpsamplingBilinear2d;

%include "./LibDL/nn/Modules/Modules.h"
%include "./LibDL/nn/Modules/ModuleTypes.h"

%template(NamedModule) std::pair<std::string, std::shared_ptr<torch::nn::Module>>;
%template( StdVectorNamedModule) std::vector<std::pair<std::string, std::shared_ptr<torch::nn::Module>>>;
//%template(ModuleList) std::vector<nn::Module>;
//%template(load_state_dict) nn::Module::load_state_dict<std::string>;